package com.example.util.rsa;

import java.util.Map;

import com.example.util.ByteUtil;


/**
 * 
 * http://www.iteye.com/topic/592426
 * */

public class RSAService {
	/**

     * 对建行返回的数据进行数字签名校验，校验算法如下:<br>

     * 1:将签名字符串和公钥转换成二进制格式<br>

     * 2:使用公钥进行签名的逆运算<br>

     * 3:使用标准MD5算法运算原文<br>

     * 4:比较1、2结果

     * @param  signature  数字签名字符串

     * @param  content    原文字符串

     * @param  publicKey  公钥字符串

     */

          public static boolean verifySignature(String signature,String content,String publicKey) throws Exception {

                   boolean status=false;

                   try {

                            //对原文进行MD5加密

                            byte[] md5bytes = Encoders.encryptMD5(content.getBytes());

                            

                            //对签名字符串进行逆运算，将16进制字符串按照约定算法转换为二进制数据

                            byte[] signbytes = ByteUtil.charToByte(signature);

                            

            //对公钥字符串进行逆运算，将16进制字符串按照约定算法转换为二进制数据

                            byte[] keybytes = ByteUtil.charToByte(publicKey);

                            

                            //校验

                            status = RSAEncoder.verify(md5bytes, keybytes, signbytes);

                   } catch (Exception e) {

                            e.printStackTrace();

                            throw new Exception("校验数字签名过程出现错误");

                   }                 

                   return status;

          }

          

          

          /**

           * 加密发送的内容

           * @param senddata  发送的内容原文

           * @return  加密后的内容

           * @throws BankException

           */

          public static String encryptSenddata(String senddata)throws Exception{

                   String result=null;

                   try {

                            result= ByteUtil.byteToChar(Encoders.encryptMD5(senddata.getBytes()));

                   } catch (Exception e) {

                            e.printStackTrace();

                            throw new Exception("加密过程出现错误");

                   }        

                   return result;

          }


          public static void testVerifySignature(String inputStr){

                 try {

                     Map<String, Object> keyMap = RSAEncoder.initKey();

                     byte[] publicKey = RSAEncoder.getPublicKey(keyMap);

                     byte[] privateKey = RSAEncoder.getPrivateKey(keyMap);

                     String publicKeyX16=ByteUtil.byteToChar(publicKey);

                     String privateKeyX16=ByteUtil.byteToChar(privateKey);

                     

                     System.out.println("------------------------------------------------------");

                     System.out.println("1:初始化RSA密钥对,16进制字符如下");

                     System.out.println("公钥: \n" + publicKeyX16);

                     System.out.println("私钥： \n" + privateKeyX16);

           

                     System.out.println("-------------------------------------------------------");

                     System.out.println("2:模拟数字签名");

                     byte[] inputData =Encoders.encryptMD5(inputStr.getBytes());

                     System.out.println("先对原文进行MD5加密,16进制字符如下:");

                     System.out.println(ByteUtil.byteToChar(inputData));

                     

                     System.out.println("再对MD5加密后的数据进行签名,签名16进制字符如下:");

                     byte[] sign=RSAEncoder.sign(inputData, privateKey);

                     String signx16=ByteUtil.byteToChar(sign);

                     System.out.println(signx16);

                     

                     System.out.println("-------------------------------------------------------");

                     System.out.println("3:校验数字签名");

                     boolean status = RSAService.verifySignature(signx16, inputStr, publicKeyX16);

                     System.out.println("状态:" + status);

                     System.out.println("--------------------------------------------------------");

                 } catch (Exception e) {

                     // TODO: handle exception

                 }      

              }

              

              

              

              public static void main(String[] args) {

                 String s="woainizhongguo";

                 testVerifySignature(s);

              }

          



}
